package top.canyue.word_range.pojo.dto;

import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Collections;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * 分装分页返回
 */

@Data
@NoArgsConstructor
@AllArgsConstructor
public class PageDTO<V> {
    // 总数据条数
    private Long total;
    // 总页数
    private Long pages;
    // 荷载
    private List<V> list;


    /**
     * 一个静态方法，用于转Page -> DTO
     * @param page MP的Page
     * @param convertor PO -> VO 转换器
     * @return DTO
     * @param <PO> PO
     * @param <VO> VO
     */
    public static <PO,VO> PageDTO<VO> of(Page<PO> page,Function<PO,VO> convertor) {
        //分装VO
        PageDTO<VO> pageDTO = new PageDTO<>();
        pageDTO.setTotal(page.getTotal());
        pageDTO.setPages(page.getPages());
        List<PO> records = page.getRecords();
        // 分页数据为空就直接返回了
        if(records.isEmpty()){
            pageDTO.setList(Collections.EMPTY_LIST);
            return pageDTO;
        }
        pageDTO.setList(
                records.stream().map(convertor).collect(Collectors.toList())
        );
        //返回
        return pageDTO;
    }

    /**
     * 如果PO、VO字段名一致，就用hutool工具实现
     * @param page MP的Page
     * @param voClass VO的字节码，用于让hutool工具装换
     * @return DTO
     * @param <PO> PO
     * @param <VO> VO
     */
    public static <PO,VO> PageDTO<VO> of(Page<PO> page,Class<VO> voClass) {
        return of(page,po -> BeanUtil.copyProperties(po,voClass));
    }
}
